//
// Author: Vladimir Migashko <migashko@gmail.com>, (C) 2011
//
// Copyright: See COPYING file that comes with this distribution
//

#ifndef HITLIST_HIT_MEHTOD_HPP
#define HITLIST_HIT_MEHTOD_HPP

#include <fas/adv/json_rpc3/method.hpp>
#include "hit_json.hpp"
#include "ihitlist.hpp"
#include "tags.hpp"


namespace aa = ::fas::aop;
namespace ap = ::fas::pattern;
namespace ad = ::fas::adv;
namespace ajr = ::fas::adv::json_rpc3;

/** @brief Метод "hit" json-rpc аспекта соединия
 *
 * Добавляется в аспект соединения с групповым тегом _gmethod_,
 * чтобы мог быть вызван аспектом json-rpc по имени, возращаемом 
 * методом name()
 */
struct hit_method
{
  ihitlist* hitlist;
  hit_method(): hitlist(0) {}

  /// имя метода json-rpc
  const char *name() const { return "hit"; }

  /// тип входящего запроса на вызов метода (json)
  typedef hit_json invoke_request;
  /// тип ответа на входящий запрос (json)
  typedef aj::value<bool> invoke_response;
  /// тип входящего уведомления (json)
  typedef hit_json invoke_notify;
  /// не разрешаем исходящие уведомления 
  // typedef aj::value<bool> call_notify;


  /// Обработка входящего запроса
  /** @param t - контекст вызова (ссылка на объект соединения )
    * @param h - запрос 
    * @param id - идентификатор вызова метода
    * @param result - ответ ()
    * @return true - если ответ готов (всегда);
    */
  template<typename T>
  bool request(T& t, const hit& h, int id, bool& result )
  {
    result = hitlist->hit(h.first_id, h.second_id);
    /// сообщаем что ответ готов
    return true;
  }

  /// Обработка входящего уведомления
  /** @param t - контекст вызова (ссылка на объект соединения )
    * @param h - запрос 
    */
  template<typename T>
  void notify(T& t, const hit& h )
  {
    hitlist->hit(h.first_id, h.second_id);
    /// уведомление в ответ НЕ отправляем
  }
};

typedef aa::tag_list_n<
  aa::tag<_hit_>,
  aa::gtag< ajr::_gmethod_ >
>::type hit_method_tag_list;

typedef aa::advice<
      hit_method_tag_list,
      ajr::method<hit_method>
    >
hit_method_advice;



#endif
